/*
* Copyright (c) 2001 Sun Microsystems, Inc.  All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in
*    the documentation and/or other materials provided with the
*    distribution.
*
* 3. The end-user documentation included with the redistribution,
*    if any, must include the following acknowledgment:
*       "This product includes software developed by the
*       Sun Microsystems, Inc. for Project JXTA."
*    Alternately, this acknowledgment may appear in the software itself,
*    if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Sun", "Sun Microsystems, Inc.", "RosettaChat", "JXTA" and
*    "Project JXTA" must not be used to endorse or promote products derived
*    from this software without prior written permission. For written
*    permission, please contact Project JXTA at http://www.jxta.org.
*
* 5. Products derived from this software may not be called "JXTA",
*    nor may "JXTA" appear in their name, without prior written
*    permission of Sun.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED.  IN NO EVENT SHALL SUN MICROSYSTEMS OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of Project JXTA.  For more
* information on Project JXTA, please see
* <http://www.jxta.org/>.
*
* This license is based on the BSD license adopted by the Apache Foundation.
*/

package net.jxta.myjxta.misc.rosettachat.http;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.HashMap;

/**
 * PostMessage.java
 *
 * @author James Todd [jwtodd@pacbell.net]
 */

public class PostMessage extends GetMessage {

    public PostMessage() {
        this(null, "");
    }

    public PostMessage(URL url) {
        this(url, "");
    }

    public PostMessage(URL url, String message) {
        this(url, ((message != null) ?
                new Message(message) : new Message()));
    }

    public PostMessage(URL url, Message message) {
        super(url, message);
        super.method = Constants.HTTP.POST;

        if (getHeader(Constants.MIME.Key.CONTENT_TYPE) == null) {
            // xxx : calling a public in a constructor
            setHeader(Constants.MIME.Key.CONTENT_TYPE,
                    Constants.MIME.Value.XML);
        }
    }

    public void setContentType(String contentType) {
        setHeader(Constants.MIME.Key.CONTENT_TYPE,
                ((contentType != null) ?
                        contentType : Constants.MIME.Value.XML));
    }

    public String getContentType() {
        return getHeader(Constants.MIME.Key.CONTENT_TYPE);
    }

    public void setBody(String body) {
        super.setBody(body);
    }

    public String getBody() {
        return super.getBody();
    }

    public Message dispatch()
            throws IOException {
        openConnection();

        try {
            doGet();
            doPost();
        } catch (IOException ioe) {
            throw new IOException(ioe.getMessage());
        }

        Message response = getResponse();

        closeConnection();

        return response;
    }

    public String toString() {
        java.lang.Class<? extends PostMessage> clazz = getClass();
        Field[] fields = clazz.getDeclaredFields();

        HashMap<String, Object> map = new java.util.HashMap<String, Object>();
        String object;
        Object value;

        for (Field field : fields) {
            try {
                object = field.getName();
                value = field.get(this);

                map.put(object, (value != null) ? value : "null");
            } catch (IllegalAccessException iae) {
                iae.printStackTrace();
            }
        }

        if (clazz.getSuperclass().getSuperclass() != null) {
            map.put("super", clazz.getSuperclass().toString());
        }

        return clazz.getName() + map;
    }

    protected void doPost()
            throws IOException {
        if (super.method.equals(Constants.HTTP.POST) &&
                super.message != null &&
                super.message.hasBody()) {
            final int BLOCK = 1024;
            char[] message = this.message.getBody().toCharArray();
            OutputStreamWriter osw =
                    new OutputStreamWriter(super.connection.getOutputStream());
            BufferedWriter writer = new BufferedWriter(osw);

            int l = BLOCK;
            int c = 0;

            while ((c * BLOCK) < message.length) {
                if (((c + 1) * BLOCK) > message.length) {
                    l = message.length - c * BLOCK;
                }

                writer.write(message, c++ * BLOCK, l);
            }

            writer.flush();
            writer.close();
        }
    }
}
